﻿namespace h5
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("=== 异步计算 a^58 + b^50 ===");

            // 定义a和b的值（大于1小于10的实数）
            double a = 2.5;
            double b = 3.7;

            Console.WriteLine($"输入参数: a = {a}, b = {b}");
            Console.WriteLine($"计算表达式: {a}^58 + {b}^50");

            try
            {
                // 使用异步方式计算结果
                double result = await CalculateExpressionAsync(a, b);

                Console.WriteLine($"\n计算结果: {result}");
                Console.WriteLine($"科学计数法表示: {result:E10}");

                // 验证结果
                await VerifyCalculationAsync(a, b, result);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"计算过程中发生错误: {ex.Message}");
            }

            Console.WriteLine("\n程序结束，按任意键退出...");
            Console.ReadKey();
        }

        static async Task<double> CalculateExpressionAsync(double a, double b)
        {
            Console.WriteLine("\n开始异步计算...");

            // 创建两个任务分别计算 a^58 和 b^50
            Task<double> taskA = CalculatePowerAsync(a, 58, "a^58");
            Task<double> taskB = CalculatePowerAsync(b, 50, "b^50");

            // 等待两个任务完成
            double[] results = await Task.WhenAll(taskA, taskB);

            double a_power = results[0];
            double b_power = results[1];

            Console.WriteLine($"\n中间结果:");
            Console.WriteLine($"{a}^58 = {a_power:E10}");
            Console.WriteLine($"{b}^50 = {b_power:E10}");

            // 返回最终结果
            return a_power + b_power;
        }

        static async Task<double> CalculatePowerAsync(double baseValue, int exponent, string operationName)
        {
            Console.WriteLine($"开始计算 {operationName}...");

            // 模拟耗时计算（实际计算很快，这里为了演示异步特性）
            await Task.Delay(100);

            double result = 1.0;

            // 使用快速幂算法优化计算
            await Task.Run(() =>
            {
                double temp = baseValue;
                int exp = exponent;
                result = 1.0;

                while (exp > 0)
                {
                    if ((exp & 1) == 1)  // 如果指数是奇数
                    {
                        result *= temp;
                    }
                    temp *= temp;  // 平方
                    exp >>= 1;     // 指数右移一位（除以2）
                }
            });

            Console.WriteLine($"{operationName} 计算完成");
            return result;
        }

        static async Task VerifyCalculationAsync(double a, double b, double asyncResult)
        {
            Console.WriteLine("\n开始验证计算结果...");

            // 同步计算用于验证
            double syncResult = await Task.Run(() =>
            {
                double a_power = Math.Pow(a, 58);
                double b_power = Math.Pow(b, 50);
                return a_power + b_power;
            });

            Console.WriteLine($"异步计算结果: {asyncResult:E10}");
            Console.WriteLine($"同步计算结果: {syncResult:E10}");
            Console.WriteLine($"结果差异: {Math.Abs(asyncResult - syncResult):E10}");

            double tolerance = 1e-10;
            if (Math.Abs(asyncResult - syncResult) < tolerance)
            {
                Console.WriteLine("✓ 计算结果验证通过");
            }
            else
            {
                Console.WriteLine("✗ 计算结果存在显著差异");
            }
        }
    }
}
